
package tienda.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import tienda.exception.DAOExcepcion;

import tienda.modelo.Persona;
import tienda.modelo.Publicacion;
import tienda.util.ConexionBD;

public class PublicacionDAO extends BaseDAO {
	
	public Collection<Publicacion> buscarPublicaciones(String keyword) throws DAOExcepcion {
		Collection<Publicacion> c = new ArrayList<Publicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
		con = ConexionBD.obtenerConexion();
		String query = "SELECT * FROM `publicacion` where titulo like '%"+keyword+"%'or descripcion like '%"+keyword+"%';";
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		while (rs.next()) {
		Publicacion vo = new Publicacion();
		vo.setDescripcion((rs.getString("descripcion")));
		vo.setDuracion((rs.getInt("duracion")));
		vo.setFoto1((rs.getString("foto1")));
		vo.setFoto2((rs.getString("foto2")));
		vo.setFoto3((rs.getString("foto3")));
		vo.setIdPublicacion((rs.getInt("idPublicacion")));
		vo.setPrecio((rs.getDouble("precio")));
		vo.setTitulo((rs.getString("titulo")));
		vo.setVisitas((rs.getInt("visitas")));
		c.add(vo);
		}
		} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
		} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
		}
		return c;
}
	
	public Collection<Publicacion> obtenerMasVendidas() throws DAOExcepcion {
		Collection<Publicacion> c = new ArrayList<Publicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
		con = ConexionBD.obtenerConexion();
		String query = "select p.descripcion,p.duracion,p.foto1,p.foto2,p.foto3,p.idPublicacion,p.precio,p.titulo,p.visitas,sum(c.cantidad) as Vendidas from publicacion as p, compra as c where p.idPublicacion = c.Publicacion_idPublicacion and p.cantidad > 0 group by p.idPublicacion order by Vendidas desc limit 0,1";
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		while (rs.next()) {
		Publicacion vo = new Publicacion();
		vo.setDescripcion((rs.getString("descripcion")));
		vo.setDuracion((rs.getInt("duracion")));
		vo.setFoto1((rs.getString("foto1")));
		vo.setFoto2((rs.getString("foto2")));
		vo.setFoto3((rs.getString("foto3")));
		vo.setIdPublicacion((rs.getInt("idPublicacion")));
		vo.setPrecio((rs.getDouble("precio")));
		vo.setTitulo((rs.getString("titulo")));
		vo.setVisitas((rs.getInt("visitas")));
		c.add(vo);
		}
		} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
		} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
		}
		return c;
}
	
	public Collection<Publicacion> obtenerPorCategoria(int idCategoria) throws DAOExcepcion {
		Collection<Publicacion> c = new ArrayList<Publicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
		con = ConexionBD.obtenerConexion();
		String query = "select p.descripcion,p.duracion,p.foto1,p.foto2,p.foto3,p.idPublicacion,p.precio,p.titulo,p.visitas from publicacion as p where p.Categoria_idCategoria = ? order by p.idPublicacion desc";
		stmt = con.prepareStatement(query);
		stmt.setInt(1, idCategoria);
		rs = stmt.executeQuery();
		while (rs.next()) {
		Publicacion vo = new Publicacion();
		vo.setDescripcion((rs.getString("descripcion")));
		vo.setDuracion((rs.getInt("duracion")));
		vo.setFoto1((rs.getString("foto1")));
		vo.setFoto2((rs.getString("foto2")));
		vo.setFoto3((rs.getString("foto3")));
		vo.setIdPublicacion((rs.getInt("idPublicacion")));
		vo.setPrecio((rs.getDouble("precio")));
		vo.setTitulo((rs.getString("titulo")));
		vo.setVisitas((rs.getInt("visitas")));
		c.add(vo);
		}
		} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
		} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
		}
		return c;
}

	public Collection<Publicacion> obtenerMasVisitadas() throws DAOExcepcion {
		Collection<Publicacion> c = new ArrayList<Publicacion>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
		con = ConexionBD.obtenerConexion();
		String query = "select descripcion,duracion,foto1,foto2,foto3,idPublicacion,precio,titulo,visitas,cantidad from publicacion order by visitas desc limit 0,6";
		stmt = con.prepareStatement(query);
		rs = stmt.executeQuery();
		while (rs.next()) {
		Publicacion vo = new Publicacion();
		vo.setDescripcion((rs.getString("descripcion")));
		vo.setDuracion((rs.getInt("duracion")));
		vo.setFoto1((rs.getString("foto1")));
		vo.setFoto2((rs.getString("foto2")));
		vo.setFoto3((rs.getString("foto3")));
		vo.setIdPublicacion((rs.getInt("idPublicacion")));
		vo.setPrecio((rs.getDouble("precio")));
		vo.setTitulo((rs.getString("titulo")));
		vo.setVisitas((rs.getInt("visitas")));
		c.add(vo);
		}
		} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
		} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
		}
		return c;
}
	
	
    public int obtenerCantidadPendiente(int idPublicacion) throws DAOExcepcion { //obtener obtenerCantidadPendiente ->zaira calle
		
    	int iCantidad=0;
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select publicacion.cantidad-IFNULL(sum( compra.cantidad),0)  as cantidadpendiente  ";
			query =query+ "from publicacion left outer join compra on "; 
			query =query+ "publicacion.idPublicacion=compra.publicacion_idpublicacion ";
			query =query+ "where publicacion.idPublicacion=? ";
			query =query+ "group by publicacion.cantidad ";
			
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setInt(1, idPublicacion);
		
		rs = stmt.executeQuery();
		if (rs.next()) {
			iCantidad=rs.getInt(1);
		
		}
		} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
		} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
		}
		return iCantidad;
	}
	
    
	public void actualizarEstadoPublicacion(int idPublicacion) throws DAOExcepcion { // actualizarEstadoPublicacion -->zaira calle
		String query = "update publicacion set estado='V' where idPublicacion=? ";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1,idPublicacion);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
			
			
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return ;
		
	}
	
	public Publicacion obtener(int idPublicacion) throws  DAOExcepcion {  //obtener  ->zaira calle
		Publicacion vo= new Publicacion();
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
		String query = "select idPublicacion, titulo, pu.descripcion as descripcionPublicacion, esNuevo, cantidad, precio, fecCreacion, duracion, visitas, Persona_idPersona, Categoria_idCategoria,pe.nombres, pe.paterno, pe.materno, pe.sexo, pe.email, pe.fecnacimiento, pe.codUsuario, pe.contrasena, pe.celular, pe.nroDocumento,t.descripcion as descripcionTipo from Publicacion as pu, Persona as pe, TipoPersona as t where idPublicacion=? and pu.Persona_idPersona = pe.idPersona and pe.TipoPersona_idTipoPersona = t.idTipoPersona";
		con = ConexionBD.obtenerConexion();
		stmt = con.prepareStatement(query);
		stmt.setInt(1, idPublicacion);
		
		rs = stmt.executeQuery();
		if (rs.next()) {
		vo.setIdPublicacion(rs.getInt(1));
		vo.setTitulo(rs.getString(2));
		vo.setDescripcion(rs.getString(3));
		vo.setEsNuevo(rs.getString(4));
		vo.setCantidad(rs.getInt(5));
		vo.setPrecio(rs.getDouble(6));
		//vo.setFecCreacion( rs.getString(7));
		vo.setDuracion(rs.getInt(8));
		vo.setVisitas(rs.getInt(9));
		
		Persona pe = new Persona();
		pe.setNombres(rs.getString(12));
		//vo.setPersona(pe);
		//vo.Persona_idPersona( rs.getString(10));
		//vo.Categoria_idCategoria( rs.getString(10));
		
		vo.setEstado(rs.getString(12));
		
		}
		} catch (SQLException e) {
		System.err.println(e.getMessage());
		throw new DAOExcepcion(e.getMessage());
		} finally {
		this.cerrarResultSet(rs);
		this.cerrarStatement(stmt);
		this.cerrarConexion(con);
		}
	
		return vo;
	}

	public Publicacion insertar(Publicacion vo) throws DAOExcepcion {
		String query = "insert into publicacion (titulo,descripcion,esNuevo,cantidad,precio,fecCreacion," +
				"duracion,foto1,foto2,foto3,visitas,persona_idPersona,categoria_idCategoria, Estado) " +
				"values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);	
			stmt.setString(1, vo.getTitulo());
			stmt.setString(2, vo.getDescripcion());
			stmt.setString(3, vo.getEsNuevo());
			stmt.setLong(4, vo.getCantidad());
			stmt.setDouble(5, vo.getPrecio());
			stmt.setString(6, vo.getFecCreacion());
			stmt.setLong(7, vo.getDuracion());
			stmt.setString(8, vo.getFoto1());
			stmt.setString(9, vo.getFoto2());
			stmt.setString(10, vo.getFoto3());
			stmt.setLong(11, vo.getVisitas());
			stmt.setLong(12, vo.getPersona_idPersona());
			stmt.setLong(13, vo.getCategoria_idCategoria());
			stmt.setString(14, vo.getEstado());	
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			vo.setIdPublicacion(id);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}	



}
